/*********************************************************************************************************
* 模块名称：SysTick.c
* 摘    要：SysTick模块，包含SysTick模块初始化以及微秒和毫秒级延时函数
* 当前版本：1.0.0
* 作    者：Leyutek(COPYRIGHT 2018 - 2021 Leyutek. All rights reserved.)
* 完成日期：2021年07月01日
* 内    容：
* 注    意：
**********************************************************************************************************
* 取代版本：
* 作    者：
* 完成日期：
* 修改内容：
* 修改文件：
*********************************************************************************************************/

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/
#include "SysTick.h"
#include "gd32f30x_conf.h"

/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              枚举结构体
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部变量定义
*********************************************************************************************************/
static  __IO  unsigned int s_iTimDelayCnt = 0;

/*********************************************************************************************************
*                                              内部函数声明
*********************************************************************************************************/
static  void TimDelayDec(void); //延时计数

/*********************************************************************************************************
*                                              内部函数实现
*********************************************************************************************************/
/*********************************************************************************************************
* 函数名称：TimDelayDec
* 函数功能：延时计数
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2021年07月01日
* 注    意：在SysTick中断服务函数SysTick_Handler中调用
*********************************************************************************************************/
static  void TimDelayDec(void)
{
    if (s_iTimDelayCnt != 0) {  //延时计数器的数值不为0
        s_iTimDelayCnt--;       //延时计数器的数值减1
    }
}

/*********************************************************************************************************
* 函数名称：SysTick_Handler
* 函数功能：SysTick中断服务函数
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2021年07月01日
* 注    意：
*********************************************************************************************************/
void  SysTick_Handler(void)
{
    TimDelayDec();  //延时计数函数
}

/*********************************************************************************************************
*                                              API函数实现
*********************************************************************************************************/
/*********************************************************************************************************
* 函数名称：InitSysTick
* 函数功能：初始化SysTick模块
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2021年07月01日
* 注    意：SystemCoreClock / 1000      1ms中断一次（计数1000次为1s，每计一次位1/1000s=1ms）
*           SystemCoreClock / 4000      0.25ms中断一次（计数4000次为1s，每计一次位1/4000s=0.25ms）
*           SystemCoreClock / 100000    10us中断一次（计数100000次为1s，每计一次位1/100000s=10us）
*           SystemCoreClock / 1000000   1us中断一次（计数1000000次为1s，每计一次位1/1000000s=1us）
*********************************************************************************************************/
void InitSysTick( void )
{
    if (SysTick_Config(SystemCoreClock / 1000U)) { //配置系统滴答定时器1ms中断一次
        while (1) {                                //错误发生的情况下，进入死循环

       }
    }
}

/*********************************************************************************************************
* 函数名称：DelayNms
* 函数功能：毫秒级延时函数
* 输入参数：nms
* 输出参数：void
* 返 回 值：void
* 创建日期：2021年07月01日
* 注    意：
*********************************************************************************************************/
void  DelayNms(__IO unsigned int nms)
{
    s_iTimDelayCnt = nms;       //将延时计数器s_iTimDelayCnt的数值赋为nms

    while (s_iTimDelayCnt != 0) { //延时计数器的数值为0时，表示延时了nms，跳出while语句

    }
}

/*********************************************************************************************************
* 函数名称：DelayNus
* 函数功能：微秒级延时函数
* 输入参数：nus
* 输出参数：void
* 返 回 值：void
* 创建日期：2021年07月01日
* 注    意：经测试，100us和200us基本准确
*********************************************************************************************************/
void  DelayNus(__IO unsigned int nus)
{
    unsigned int s_iTimCnt = nus;       //定义一个变量s_iTimCnt作为延时计数器，赋值为nus
    unsigned short i;                   //定义一个变量作为循环计数器

    while (s_iTimCnt != 0) {            //延时计数器s_iTimCnt的值不为0
        for (i = 0; i < 22; i++) {         //空循环，产生延时功能

        }

        s_iTimCnt--;                      //成功延时1us，变量s_iTimCnt减1
    }
}
